// src/router/guards.ts
import type { Router } from "vue-router";
import { useUserStore } from "@/stores/modules/user";
import { checkAuthStatus } from "@/utils/auth";

// 创建独立的加载状态管理，避免依赖Pinia
let routeLoading = false;
export function setupRouterGuards(router: Router) {
  router.beforeEach(async (to, from, next) => {
    const userStore = useUserStore();
    try {
      // 使用独立的状态管理，而不是Pinia store
      routeLoading = true;
      // 1. 记录路由跳转（开发环境）
      if (import.meta.env.DEV) {
        console.log("[路由] %s → %s", from.path, to.path);
      }
      // 1. 白名单直接放行
      if (to.meta.public) return next();
      // 2. 处理未匹配路由
      if (to.matched.length === 0) {
        return next("/404");
      }

      // 3. 检查登录状态
      const isLoggedIn = userStore.isLoggedIn;
      console.log("登录状态：", isLoggedIn);

      // 3. 需要认证但未登录 → 跳转登录
      if (to.meta.requiresAuth && !isLoggedIn) {
        return next({
          path: "/login",
          query: { redirect: to.fullPath },
        });
      }
      // 2. 已登录用户访问登录/注册页 → 重定向到首页或来源页
      if ((to.path === "/login" || to.path === "/register") && isLoggedIn) {
        return next(from.path || "/");
      }
      console.log("放行主路由");
      // 4. 放行主路由
      next();
      // 5. 登录状态处理
      if (!isLoggedIn) {
        try {
          // 尝试自动登录（例如通过refresh token）
          await checkAuthStatus();
          // 如果认证状态改变，可以重定向
          if (userStore.isLoggedIn && to.path === "/login") {
            router.replace(from.path || "/");
          }
        } catch (error) {
          // 自动登录失败，跳转到登录页并携带重定向信息
          if (to.path !== "/login") {
            return next({
              path: "/login",
              query: { redirect: to.fullPath },
            });
          }
        }
      }

      // 4. 需要认证但未登录 → 跳转到登录页
      if (to.meta.requiresAuth && !userStore.isLoggedIn) {
        return next({
          path: "/login",
          query: { redirect: to.fullPath },
        });
      }
    } catch (error) {
      console.error("[路由守卫异常]", error);
      next("/500"); // 跳转到错误页
    } finally {
      routeLoading = false;
    }
  });

  // 可选的错误处理
  router.onError((error) => {
    console.error("路由错误:", error);
  });
}
